java的类常量和文件导入

时间:2014-12-06 19:54:03

标签: java

我几乎试图使用类常量声明为文件但是出错。

import java.awt.*;
import java.util.*;
import java.io.*;

public class BabyNames {
   public static final Scanner NAME=new Scanner(new File("names.txt")); //specifically this part 
   public static final int YEAR=1900;                                   //generates the error
   public static final int LS=11;
   public static final int WIDTH=50;
   public static void main(String[] args) throws FileNotFoundException{
      intro();
      personName();
      graph();
   }

// Error contained:
// BabyNames.java:6: error: unreported exception FileNotFoundException; must be caught or
// declared to be thrown                 
//   public static final Scanner NAME=new Scanner(new File("names.txt"));
                                ^
//1 error

这不是所有程序,但不认为其余的是必需的。 对不起,如果我的询问方法很时髦,第一次。非常感谢。

3 个答案:

答案 0 :(得分:0)

您需要尝试捕捉该代码。

这就是“必须被抓住或宣布被抛出”的意思。

阅读本文:doc oracle

答案 1 :(得分:0)

有两种类型的例外: 1)检查异常:那些应该在编译时处理(通过使用try,catch,throws) 2)unchecked异常:这些异常没有编译器错误,但在运行时可能会发生异常。

你的情况是第一个FileNotFoundException被检查异常所以要么你必须在try catch块中写入该行,或者你必须使用关键字throws。将异常处理传递给调用方法。

答案 2 :(得分:0)

从技术上讲,您可以使用静态初始化程序块来设置staic final Scanner变量。在初始化程序块中,您可以使用try / catch:

public static final Scanner NAME; 

static {
  // Be sure scanner is initialized even in the case of an exception
  Scanner scanner = null;

  try {
    new Scanner(new File("names.txt"));
  } catch (FileNotFoundException e) {
    e.printStackTrace();
  }
  NAME = scanner;
}

但是:将类Scanner之类的实例保存为静态常量是不好的方式。扫描仪是单向对象。您即将使用文件内容。将这样的对象保持为常数并且如果它是public则更少是没有意义的。 一旦加载了类,静态变量就会初始化,并且与程序一样长。在大多数情况下,这不是你想要的。

更好的方法是将其作为实例变量并在构造函数中初始化它。并将其作为私人课程。您可以将文件名保存为常量,并创建构造函数以接受任何文件名。方法intro()personName()graph()也可以成为实例方法。

public class BabyNames {
  public static final String NAMES_FILE_NAME = "names.txt";

  public static final int YEAR=1900;                                   
  public static final int LS=11;
  public static final int WIDTH=50;

  private final Scanner name; 

  public BabyNames(String fileName) throws FileNotFoundException {
    name = new Scanner(new File(fileName));

  }

  public static void main(String[] args) throws FileNotFoundException {
    BabyNames babyNames = new BabyNames(NAMES_FILE_NAME);
    babyNames.intro();
    babyNames.personName();
    babyNames.graph();
  }

  public void graph() {
    // ...    
  }

  public void personName() {
    // ...    
  }

  public void intro() {
    // ...    
  }

  // ...
}

因此,Scanner变量仅为BabyNames类所知,并且与特定BabyNames实例一样长。这种模块化程度更高,维护更好,更易于测试。例如。您可以编写单元测试并使用测试文件初始化您的课程。