在Java

时间:2015-11-20 21:09:02

标签: java bluej

我试图在java中抛出自定义异常,但目前我没有运气。我有两个类readWrite类,它允许用户输入文件名和要写入文件的文本(通过构造函数)。它有三个方法,write,read和writeToFile,它验证文件是否以.txt结尾,如果它现在它应该抛出我的自定义异常类,声明“抱歉但这个系统只接受.txt文件”,我在一个我的自定义异常中的toString()方法。我似乎无法使其工作,下面是代码,有些人可能会提供帮助,我希望我已经正确解释,因为我是Java的新手,注意我已经注释掉了一些代码,因为我正在尝试一些不同的东西来让它发挥作用

ReadWrite.java

import java.io.*;

public class ReadWrite
{   
    private final String file;
    private final String text;

    public ReadWrite(String file, String text)
    {
        // initialise instance variables
        this.file=file;
        this.text=text;   
    }

    private void write() //throws InvalidFileException 
    {
        try {
            FileWriter writer = new FileWriter(file);

            writer.write(text);
            writer.write('\n');
            writer.close();
        }
        catch(IOException e)
        {
            System.out.print(e);
        }
    }

    public boolean writeToFile() 
    {    
        boolean ok;

        try{        
            FileWriter writer = new FileWriter(file);       
            {   
                if(file.toLowerCase().endsWith(".txt"))
                {  
                    write();
                    ok = true;
                } //if end
                else{
                    ok=false;
                    //throw new InvalidFileException();
               } //else end
            }
        } //try end
        catch(IOException e) {
           ok=false; 
        } // catch end         
        //catch (InvalidFileException e){

            //System.out.println(e.toString());
        //}
        return ok;
    }

    public void read(String fileToRead)
    {
        try {
            BufferedReader reader = new BufferedReader(new FileReader(fileToRead));
            String line = reader.readLine();

            while(line != null) {
               System.out.println(line);
               line = reader.readLine();
            }// while end

            reader.close();

        }//try end
        catch(FileNotFoundException e) {                  
            System.out.println(fileToRead + " the system can not     find the file specified");                  
        }  //catch end
        catch(IOException e) {                          
            e.printStackTrace();

        } //catch end
    }
}

InvalidFileException.java

import java.io.FileNotFoundException;
import java.io.*;

public class InvalidFileException extends Exception
{
    /**
     * Constructor for objects of class InvalidFileException
     */
    public InvalidFileException(String message)
    {
        super(message);
    }

    public String toString()
    {
        return ("Sorry but this system only accepts .txt files");
    }
}

3 个答案:

答案 0 :(得分:1)

试试这个:

private void write() throws InvalidFileException {
try {
    if(!file.getName().endsWith(".txt") {
        throw new InvalidFileException(".txt files only.");
    }
    FileWriter writer = new FileWriter(file);

    writer.write(text);
    writer.write('\n');
    writer.close();
}
catch(IOException e)
{
    // handle exception please.
}

请注意,您必须覆盖" getMessage()"用于打印自定义消息的异常方法。或者在super()调用中设置它。

覆盖toString()方法会使你的super()调用,因此你的自定义(详细信息)消息传递给异常(在我的例子中只有#34; .txt文件。")已过时,因为这个字符串再也不会被打印出来了。

答案 1 :(得分:0)

以下是您的要求:

  

它不应该抛出我的自定义异常类来说明这一点   "抱歉,但此系统只接受.txt文件"

我认为你因toString而感到困惑。你真的不需要toString方法。您正确实现了InvalidFileException接受String参数。

所以,现在您只需要throw new InvalidFileException("Sorry but this system only accepts .txt files");或在投掷InvalidFileException时使用您想要的任何字符串消息。

请注意,如果从方法中抛出异常并使用相同的方法捕获异常看起来不合逻辑,除非您这样做,因为APM(应用程序性能监视)工具记录的目的。

另外注意,如果你抛出这样的异常,那么你需要在方法签名中添加一个throw语句,表明这个方法"可能"抛出某某异常。因此,该方法的调用可以重新抛出或捕获它。

如果您正在某处捕获异常,那么在异常对象上使用getMessage方法,您将获得与抛出异常时相同的消息,在这种情况下 - " 抱歉,但这样系统只接受.txt文件"

答案 2 :(得分:-1)

InvalidFileException扩展了Exception,但您只是试图抓住IOExceptionFileNotFoundException。我认为你的意思是InvalidFileException延长IOException