我试图在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");
}
}
答案 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
,但您只是试图抓住IOException
和FileNotFoundException
。我认为你的意思是InvalidFileException
延长IOException
。