【问题标题】:Program only throws exception when variable is defined in "try"程序仅在“try”中定义变量时抛出异常
【发布时间】:2019-03-22 00:54:08
【问题描述】:

我正在尝试编写一个可以读取网页的程序。以下代码无效:

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。

【问题讨论】:

标签: html url try-catch processing


【解决方案1】:

让我们看看这段代码:

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 可能未分配。

您可以通过自己分配默认值或将所有内容移动到同一块内来解决此问题,就像我们在上面的简化示例中所做的那样。

【讨论】:

    猜你喜欢
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2012-02-20
    • 1970-01-01
    • 2011-05-30
    相关资源
    最近更新 更多