Когда вы вызываете конструктор, инициализаторы переменной экземпляра запускаются перед телом конструктора. Что вы думаете о выходе программы ниже?
public class Tester {
private Tester internalInstance = new Tester();
public Tester() throws Exception {
throw new Exception("Boom");
}
public static void main(String[] args) {
try {
Tester b = new Tester();
System.out.println("Eye-Opener!");
} catch (Exception ex) {
System.out.println("Exception catched");
}
}
}
Основной метод вызывает конструктор Tester, который выдает исключение. Вы могли бы ожидать, что предложение catch поймает это исключение и выведет Исключение, пойманное . Но если вы попытались запустить его, вы обнаружили, что он ничего не делает, и он выбрасывает StackOverflowError
.
сделайте следующее:
use POSIX ();
что остановит экспорт всех стандартных функций модуля POSIX. Затем вам нужно будет добавить префикс POSIX:: ко всем методам POSIX, например:
POSIX::remove(filename)
для функции удаления POSIX.
Другой способ подавить это предупреждение – поместить переопределение подпрограммы в блок без предупреждений 'переопределить'
:
{
no warnings 'redefine';
sub remove { ... }
}
Вы можете исключить определенные символы из обычного экспорта с помощью директивы '!name' (см. perldoc Exporter), например:
#!/usr/bin/perl -w
package Foo;
use strict;
use POSIX '!remove';
...
sub remove {
...
}
...