Программа генерирует исключение, только если переменная определена в «try» - PullRequest
1 голос
/ 22 марта 2019

Я пытаюсь написать программу, которая будет читать веб-страницу. Следующий код недействителен:

String[] lines;
try {
  lines = loadStrings(url);
}
catch(IOException e) {
  return;
}

Но этот код:

try {
  String[] lines = loadStrings(url);
}
catch(IOException e) {
  return;
}

Я не могу использовать код во втором примере, потому что мне нужно использовать переменную "lines" позже в программе. Есть ли другой способ перехватить это исключение (ошибка 504)?

Пример:

PFont f;
String webpage;

void setup() {
  size(400, 400);  
  f = createFont("Arial", 16);
}


void draw() {  
  background(255); 
  textFont(f);
  fill(0);    
  text("Press Return to Start", 25, 90);
}


void keyPressed() {
  if (key == '\n') {
    webpage = "processing.org";
    loadData(webpage);
  }
}


void loadData(String webpage) {

  String url = "www.processing.org";
  try {
    String[] lines = loadStrings(url);
  }
  catch(IOException e) {
    return;
  }
  saveStrings("Stuff on Webpage.txt", lines);
}

Здесь происходит сбой программы:

java.io.IOException: Server returned HTTP response code: 504 for URL: http://www.processing.org/

В случае этого исключения я бы хотел, чтобы программа вышла из функции loadData и продолжила работу с keyPressed.

1 Ответ

0 голосов
/ 23 марта 2019

Давайте посмотрим на этот код:

String message;

if(random(1) < .5) {
  message = "hello";
}

println(message);

Этот код выдаст сообщение об ошибке message cannot be resolved to a variable. Это связано с тем, что компилятор достаточно умен, чтобы знать, что в зависимости от того, что делает оператор if, message может не содержать значения. Обработка / Java не присваивает значение по умолчанию локальным переменным.

Мы могли бы исправить эту ошибку компилятора, присвоив значение по умолчанию самостоятельно:

String message = null;

if(random(1) < .5) {
  message = "hello";
}

println(message);

Теперь message имеет значение по умолчанию null, которое соответствует тому, что происходит с переменными эскиза / класса по умолчанию.

Другой способ исправить это, поместив вызов println() в оператор if:

String message;

if(random(1) < .5) {
  message = "hello";
  println(message);
}

Мы могли бы немного упростить это:

if(random(1) < .5) {
  String message = "hello";
  println(message);
}

Теперь вернемся к вашему коду:

try {
  String[] lines = loadStrings(url);
}
catch(IOException e) {
  return;
}
saveStrings("Stuff on Webpage.txt", lines);

Это не работает, потому что lines объявлено внутри блока try, поэтому оно выходит из области действия за пределы этого блока, и вы не сможете использовать его впоследствии.

String[] lines;
try {
  lines = loadStrings(url);
}
catch(IOException e) {
  return;
}
saveStrings("Stuff on Webpage.txt", lines);

Это не работает, потому что компилятор не достаточно умен, чтобы увидеть этот оператор return. Он просто знает, что одна ветвь кода пропускает строку lines = loadStrings(url);, поэтому он знает, что lines может быть не назначено при попытке его использовать.

Вы можете исправить это, либо присвоив значение по умолчанию самостоятельно, либо переместив все в один и тот же блок, как мы это делали в нашем упрощенном примере выше.

...