java - 是否总是需要在方法中编写 try-catch(),静态 void main() 是方法,是的,静态 void main() 是方法?
问题描述
为什么不在方法内部的 try-catch 有效?
package ro.ase.acs.main;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import ro.ase.acs.classes.Addition;
import ro.ase.acs.classes.Robot;
import ro.ase.acs.interfaces.BinaryOperation;
import ro.ase.acs.interfaces.DisplayService;
public class Main {
public static void main(String[] args) {
Robot robot = new Robot();
robot.setName("Lego Mindstorms");
robot.setAutonomy(2);
robot.setProductionYear(2015);
try(FileOutputStream fos = new FileOutputStream("robot.bin");
DataOutputStream data = new DataOutputStream(fos)) {//baga in fisier datele setate mai sus;
data.writeUTF(robot.getName());
data.writeFloat(robot.getAutonomy());
data.writeInt(robot.getProductionYear());
} catch(IOException e) {
e.printStackTrace();
}
Robot robot2 = new Robot();
try(FileInputStream fis = new FileInputStream("robot.bin");//se citesc datele din fisier;se creeaza un al 2-lea obiect cu datele pe care le-am bagat anterior in fisier;
DataInputStream data = new DataInputStream(fis)) {
robot2.setName(data.readUTF());
robot2.setAutonomy(data.readFloat());
robot2.setProductionYear(data.readInt());
} catch(IOException e) {
e.printStackTrace();
}
System.out.println(robot2);
try(FileOutputStream fos = new FileOutputStream("robot.dat");
ObjectOutputStream oos = new ObjectOutputStream(fos)) {//ia toate datele ,atributele gasite -n obiectul dat,anterior, cand le-am setat la inceputul programului
//le scrie byte cu byte in fisier
oos.writeObject(robot);
} catch(IOException e) {
e.printStackTrace();
}
Robot robot3 = new Robot();
try(FileInputStream fis = new FileInputStream("robot.dat");//se baga datele, luate anterior, in robot3;
ObjectInputStream ois = new ObjectInputStream(fis)) {
robot3 = (Robot)ois.readObject();
} catch(IOException | ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println(robot3);
System.out.println(new Robot());
BinaryOperation op = new Addition();
op = new BinaryOperation() {
@Override
public double operation(int x, int y) {
return x - y;
}
};
op = (int a, int b) -> a * b;
op = (a, b) -> a / b;
op = (a, b) -> { return Math.pow(a, b); };
double result = op.operation(2, 3);
System.out.println(result);
DisplayService ds = (m) -> System.out.println(m);
ds = m -> { System.out.print("Message: "); System.out.println(m);};
ds.display("Hello from the Lambda expression");
}
}
这是我老师写的代码,我读到try-catch()只有在方法内部才有效,但在上面的代码中,它不在方法内部工作。声明一个新对象就足够了在 try-catch 之前编写 try 而不将其包含在方法中?
是的,static void main() 是一种方法,这就是为什么我们可以在 static void main() 中编写 try-catch 语句而不会出现错误的原因。
解决方案
public static void main(String[] args) { ... }
是一个方法,try-catch 块在这个 main 方法中执行。
一般回答您的问题:您可以在方法中编写 try-catch 块,也可以使用静态块(将在 main 方法之前执行):
class ClassName {
static {
//try-catch here
}
}
但是,您不能编写如下内容:
class ClassName {
//try-catch here
}
推荐阅读
- arrays - 来自随机排序数组的 C 第一和第三四分位数
- java - Java:从索引到结尾的子字符串
- mongodb - 根据对象数组中的属性过滤掉 MongoDB 文档
- google-sheets - 获取两个日期之间的差异
- wordpress - Wordpress:只有子类别可点击帖子编辑器
- visual-studio-code - 如何通过cmd+单击vscode输出面板中的路径打开文件
- ms-access - 计算机的未知更新导致“无法打开使用以前版本创建的数据库”错误?
- python - ModuleNotFoundError:没有名为“tensorflow_datasets”的模块。如何解决这个问题?
- c# - 使用 .NET Core 5 确定屏幕大小?
- bash - 如何在 bash 中传递双引号“--参数值”字符串