【问题标题】:Unhandled exception type IOException in JavaJava中未处理的异常类型IOException
【发布时间】:2013-10-24 12:28:55
【问题描述】:

我刚开始使用 Java,所以我犯了很多错误,我已经解决并理解了许多错误,但现在我遇到了输入问题。我看到有两种输入:InputBufferedReader 和 Scanner,但我读到第一种更好(我还不知道为什么),所以我正在使用它。

我得到的错误是:

代码

import java.io.InputStreamReader;
import java.io.BufferedReader;

public class Cerchio{

  private float r;
  private float area;
  private float cfr;
  final double pi = 3.14;


  public static void main(String[] args){
    System.out.println("Programma cerchio\n");

    Cerchio cerchio = new Cerchio(); 
    cerchio.getR();
    cerchio.c_cfr();
    cerchio.c_area();
    System.out.println("La circonferenza è: " + cerchio.cfr);
    System.out.println("L area è: " + cerchio.area);
  }

  private float getR(){
    InputStreamReader input = new InputStreamReader(System.in);
    BufferedReader num = new BufferedReader(input);

    try{
      String sr = num.readLine();
      r = Float.valueOf(sr).floatValue();
    } catch(NumberFormatException nfe){
        System.out.println("Incorrect!!!");
      }
    return r;
  }

  private float c_cfr(){
    cfr =(float)(2 * pi * r); //casting
    return cfr;
  }

  private float c_area(){
    area = (float)(pi * (r*r));
    return area;
 }

}

可能还有其他错误,但我不知道如何解决这个错误。

怎么了?谢谢!

PS:我阅读了this,但我不明白为什么以及如何工作

【问题讨论】:

  • Berry120 确实是正确的,但是在风格上;当您捕获异常时,您只需打印“不正确”,但程序会继续其愉快的方式;这是期望的行为还是程序无法继续还是致命问题?捕获异常时,您应该始终修复问题或抛出运行时异常以结束程序,否则您可能会遇到奇怪的错误,唯一的线索是在程序编写的其他所有内容中写有一点“不正确”跨度>
  • 或者总而言之,这是程序的可取性顺序; (1)它工作正常,(2)它在问题发生时崩溃到运行时异常,(3)它运行但给出了错误的答案或在一个令人困惑的地方崩溃。不惜一切代价避免使用低于 3 的程序

标签: java


【解决方案1】:

Alessio,在 Java 中,您有 2 种类型的异常:

  • 例外:已检查
  • 运行时异常:未检查

当方法可以触发“已检查”异常时,您必须对其进行处理。

要做到这一点,您有两种方法:

  • 在方法签名的末尾添加“抛出 IOException”(这是您发布的链接所建议的内容)
  • 使用try catch 块处理您的异常。

在您的情况下,IOException 是一个“已检查”异常,因此您应该在您的 getR 方法中添加一个“抛出 IOException”或使用 try catch 处理它。

PS:如果你正在学习java,最好使用Eclipse之类的IDE,你会更容易理解错误,因为它会通过一些文本突出显示你,它会为你提供解决方案.

【讨论】:

  • @AlessioMTX 是的,如果您检查方法 readLine,它会抛出 IOException。所以你也必须处理它:)
【解决方案2】:

您已经捕获了NumberFormatException,但您还需要在该语句周围捕获IOException(或从该方法中抛出它,然后在其他地方捕获它。)

try{
    String sr = num.readLine();
    r = Float.valueOf(sr).floatValue();
} 
catch(NumberFormatException nfe){
    System.out.println("Incorrect!!!");
}
catch(IOException ex) {
    ex.printStackTrace();
}

如果您使用的是 Java 7(或更高版本),您可以根据需要将两个异常合并到同一个块中:

catch(NumberFormatException|IOException ex){
    ex.printStackTrace();
}

【讨论】:

  • 你不觉得如果他明白问题出在哪里,他就不需要来这里问了。您提供的解决方案不是“为什么”(他可能会想知道why should i use catch or throws?
  • 什么 ex.printStackTrace();有吗?
【解决方案3】:

试试这个,我会在最后解释这个

public class Cerchio{

  private float r;
  private float area;
  private float cfr;
  final double pi = 3.14;


  public static void main(String[] args){
    System.out.println("Programma cerchio\n");

    Cerchio cerchio = new Cerchio(); 
    cerchio.getR();
    cerchio.c_cfr();
    cerchio.c_area();
    System.out.println("La circonferenza è: " + cerchio.cfr);
    System.out.println("L area è: " + cerchio.area);
  }

  private float getR(){
    InputStreamReader input = new InputStreamReader(System.in);
    BufferedReader num = new BufferedReader(input);

    try{
      String sr = num.readLine();
      r = Float.valueOf(sr).floatValue();
    } catch(NumberFormatException nfe){
        nfe.printStackTrace();
        System.out.println("Incorrect!!!");
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return r;
  }

  private float c_cfr(){
    cfr =(float)(2 * pi * r); //casting
    return cfr;
  }

  private float c_area(){
    area = (float)(pi * (r*r));
    return area;
 }

}

您必须捕获正确的异常或在您的方法中添加 throws 声明。

此外,最佳做法是始终打印堆栈跟踪,以了解异常的全部内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-01
    • 2023-03-12
    • 2018-06-03
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    相关资源
    最近更新 更多