Java一行实现try catch捕获异常
时间: 2023-08-13 22:09:56 浏览: 56
在Java中,可以使用lambda表达式和函数式接口来实现一行代码中的try-catch捕获异常。以下是一个示例:
```java
// 假设你有一个需要处理的函数
void someFunction() throws SomeException {
// 可能会抛出 SomeException 异常的代码
}
// 使用lambda表达式和函数式接口来捕获异常
Runnable runnable = () -> {
try {
someFunction();
} catch (SomeException e) {
// 异常处理逻辑
}
};
// 在其他地方执行捕获异常的代码
runnable.run();
```
在上面的示例中,我们创建了一个`Runnable`对象,使用lambda表达式定义了一个匿名方法。在这个方法中,我们调用了`someFunction()`方法,并在try块中捕获了`SomeException`异常,然后可以在catch块中编写处理异常的逻辑。最后,我们通过执行`runnable.run()`来执行这段代码并捕获异常。
请注意,这种方式只适用于那些没有返回值的函数。如果你的函数有返回值,你可能需要使用其他方式来处理异常。
相关问题
java try catch 中的finally执行时机
在 Java 中,finally 块中的代码会在 try 或 catch 块中的代码执行完毕之后执行。不论 try 或 catch 中是否抛出异常,finally 块中的代码都会被执行。下面是 finally 块的执行顺序:
1. 当 try 块或 catch 块中的代码执行完毕后,会等待 finally 块中的代码执行完毕后才会执行下一行代码。
2. 如果 try 块或 catch 块中的代码抛出了异常并被捕获,那么会先执行相应的 catch 块中的代码,然后再执行 finally 块中的代码。
3. 如果 try 块或 catch 块中的代码抛出了异常并未被捕获,那么会在 finally 块中执行完毕之后,再将异常抛出给上层调用者处理。
需要注意的是,如果在 finally 块中执行了 return 语句,那么会立即返回,不会执行 try 或 catch 块中未执行的代码。如果在 finally 块中抛出了异常,那么它会覆盖 try 或 catch 块中的异常。
在Android studio中的MainAcvity.java里面写一个能实现加减乘除,连续加减,小数点和0在空的情况下只能点一次,不考虑加减乘除的运算优先级从左到右依次计算,有归0和backspace功能,上一步运算得到的数可以用来继续运算,0做被除数报错后按下一个数字可以正常显示,只输入加减乘除四个运算符号按等于显示0,可以进行负数运算,输入特殊符号和不合理运算try catch捕获异常,0不能做被除数用try catt捕获异常的计算器,给出每行代码的详细解释
好的,以下是实现上述功能的代码及解释:
```java
public class MainActivity extends AppCompatActivity {
private TextView mResultTextView; // 显示计算结果的TextView
private String mLastOperand = ""; // 上一个操作数
private String mCurrentOperand = ""; // 当前操作数
private char mLastOperator = ' '; // 上一个运算符
private boolean mIsLastResult = false; // 上一次计算是否得到结果
private boolean mIsLastOperator = false; // 上一次输入是否为运算符
private boolean mIsLastPoint = false; // 上一次输入是否为小数点
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取显示计算结果的TextView
mResultTextView = findViewById(R.id.result_text_view);
// 设置数字按钮的点击事件
findViewById(R.id.button_0).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
inputNumber("0");
}
});
findViewById(R.id.button_1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
inputNumber("1");
}
});
findViewById(R.id.button_2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
inputNumber("2");
}
});
findViewById(R.id.button_3).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
inputNumber("3");
}
});
findViewById(R.id.button_4).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
inputNumber("4");
}
});
findViewById(R.id.button_5).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
inputNumber("5");
}
});
findViewById(R.id.button_6).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
inputNumber("6");
}
});
findViewById(R.id.button_7).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
inputNumber("7");
}
});
findViewById(R.id.button_8).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
inputNumber("8");
}
});
findViewById(R.id.button_9).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
inputNumber("9");
}
});
// 设置运算符按钮的点击事件
findViewById(R.id.button_add).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
inputOperator('+');
}
});
findViewById(R.id.button_subtract).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
inputOperator('-');
}
});
findViewById(R.id.button_multiply).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
inputOperator('*');
}
});
findViewById(R.id.button_divide).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
inputOperator('/');
}
});
// 设置小数点按钮的点击事件
findViewById(R.id.button_point).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
inputPoint(".");
}
});
// 设置归零按钮的点击事件
findViewById(R.id.button_clear).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
clear();
}
});
// 设置backspace按钮的点击事件
findViewById(R.id.button_backspace).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
backspace();
}
});
// 设置等于按钮的点击事件
findViewById(R.id.button_equals).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
calculate();
}
});
// 设置正负号按钮的点击事件
findViewById(R.id.button_negate).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
negate();
}
});
}
// 输入数字
private void inputNumber(String number) {
// 如果上一次计算得到结果,则清空操作数
if (mIsLastResult) {
clear();
mIsLastResult = false;
}
// 如果当前操作数是0,则不能再输入0
if (mCurrentOperand.equals("0")) {
if (number.equals("0")) {
return;
} else if (!mIsLastPoint) {
mCurrentOperand = "";
}
}
// 输入数字
mCurrentOperand += number;
mResultTextView.setText(mCurrentOperand);
mIsLastOperator = false;
}
// 输入运算符
private void inputOperator(char operator) {
// 如果上一次输入是运算符,则替换上一次输入的运算符
if (mIsLastOperator) {
mLastOperator = operator;
mResultTextView.setText(mLastOperand + " " + operator);
} else {
// 计算上一次的运算结果,并保存当前运算符和操作数
calculate();
mLastOperand = mCurrentOperand;
mLastOperator = operator;
mCurrentOperand = "";
mResultTextView.setText(mLastOperand + " " + operator);
}
mIsLastOperator = true;
mIsLastPoint = false;
}
// 输入小数点
private void inputPoint(String point) {
// 如果上一次计算得到结果,则清空操作数
if (mIsLastResult) {
clear();
mIsLastResult = false;
}
// 如果当前操作数已经有小数点,则不能再输入小数点
if (mIsLastPoint) {
return;
}
// 如果当前操作数为空,则在前面加上0
if (mCurrentOperand.isEmpty()) {
mCurrentOperand = "0" + point;
} else {
mCurrentOperand += point;
}
mResultTextView.setText(mCurrentOperand);
mIsLastOperator = false;
mIsLastPoint = true;
}
// 归零
private void clear() {
mLastOperand = "";
mCurrentOperand = "";
mLastOperator = ' ';
mResultTextView.setText("0");
mIsLastResult = false;
mIsLastOperator = false;
mIsLastPoint = false;
}
// backspace
private void backspace() {
// 如果当前操作数为空,则返回
if (mCurrentOperand.isEmpty()) {
return;
}
// 删除最后一个字符
mCurrentOperand = mCurrentOperand.substring(0, mCurrentOperand.length() - 1);
// 如果当前操作数为空,则显示0
if (mCurrentOperand.isEmpty()) {
mResultTextView.setText("0");
} else {
mResultTextView.setText(mCurrentOperand);
}
mIsLastOperator = false;
mIsLastPoint = false;
}
// 计算结果
private void calculate() {
// 如果当前操作数为空,则返回
if (mCurrentOperand.isEmpty()) {
return;
}
try {
double last = Double.parseDouble(mLastOperand);
double current = Double.parseDouble(mCurrentOperand);
double result;
switch (mLastOperator) {
case '+':
result = last + current;
break;
case '-':
result = last - current;
break;
case '*':
result = last * current;
break;
case '/':
// 如果当前操作数为0,则抛出异常
if (current == 0) {
throw new ArithmeticException("Divide by zero");
}
result = last / current;
break;
default:
result = current;
break;
}
mResultTextView.setText(String.valueOf(result));
mLastOperand = String.valueOf(result);
mCurrentOperand = "";
mLastOperator = ' ';
mIsLastResult = true;
mIsLastOperator = false;
mIsLastPoint = false;
} catch (NumberFormatException e) {
// 数字格式异常,不做处理
} catch (ArithmeticException e) {
// 除零异常,提示用户
Toast.makeText(this, "除数不能为0", Toast.LENGTH_SHORT).show();
clear();
}
}
// 正负号
private void negate() {
// 如果当前操作数为空,则返回
if (mCurrentOperand.isEmpty()) {
return;
}
// 如果当前操作数已经带有负号,则去掉负号
if (mCurrentOperand.charAt(0) == '-') {
mCurrentOperand = mCurrentOperand.substring(1);
} else {
mCurrentOperand = "-" + mCurrentOperand;
}
mResultTextView.setText(mCurrentOperand);
mIsLastOperator = false;
mIsLastPoint = false;
}
}
```
注释已经详细解释了每行代码的作用,具体实现思路如下:
1. 使用`TextView`控件显示计算结果。
2. 分别为数字、运算符、小数点、归零、backspace、等号和正负号按钮设置点击事件。
3. 输入数字时,如果上一次计算得到结果,则清空操作数;如果当前操作数是0,则不能再输入0;否则将数字添加到当前操作数后面,并更新显示。
4. 输入运算符时,如果上一次输入是运算符,则替换上一次输入的运算符;否则计算上一次的运算结果,并保存当前运算符和操作数,并更新显示。
5. 输入小数点时,如果上一次计算得到结果,则清空操作数;如果当前操作数已经有小数点,则不能再输入小数点;如果当前操作数为空,则在前面加上0;否则将小数点添加到当前操作数后面,并更新显示。
6. 归零时,清空上一个操作数、当前操作数、上一个运算符,并将显示文本设置为0。
7. backspace时,删除当前操作数的最后一个字符,如果当前操作数为空,则显示0。
8. 计算结果时,如果当前操作数为空,则返回;否则根据上一个操作数、当前操作数和上一个运算符进行运算,并更新显示;如果当前操作数为0,则抛出除零异常;如果运算过程中出现数字格式异常,则不做处理;如果出现除零异常,则提示用户除数不能为0,并清空操作数。
9. 正负号时,如果当前操作数为空,则返回;如果当前操作数已经带有负号,则去掉负号;否则在前面加上负号,并更新显示。