try-finally 启示

探讨Java中try-finally语句如何决定方法的实际返回值。即使try块内return true,由于finally块内的return false,方法最终返回false。解释了finally块执行的优先级及其对方法返回值的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class Test {
    public static void main(String[] args) {
        System.out.println(decision());
    }
    static boolean decision() {
        try {
            return true;
        } finally {
            return false;
        }
    }
}

你可能会认为这个程序是不合法的。毕竟,decision方法不能同时返回true和false。如果你尝试一下,就会发现它编译时没有任何错误,并且它所打印的是false。为什么呢?
原因就是在一个try-finally语句中,finally语句块总是在控制权离开try语句块时执行的。无论try语句块是正常结束的,还是意外结束的,情况都是如此。一条语句或一个语句块在它抛出了一个异常,或者对某个封闭型语句执行了一个break或continue,或是象这个程序一样在方法中执行了一个return时,将发生意外结束。它们之所以被称为意外结束,是因为它们阻止程序去按顺序执行下面的语句。

当try语句块和finally语句块都意外结束时,在try语句块中引发意外结束的原因将被丢弃,而整个try-finally语句意外结束的原因将于finally语句块意外结束的原因相同。在这个程序中,在try语句块中的return语句所引发的意外结束将被丢弃,而try-finally语句意外结束是由finally语句块中的return造成的。简单地讲,程序尝试着(try)返回(return)true,但是它最终(finally)返回(return)的是false。

丢弃意外结束的原因几乎永远都不是你想要的行为,因为意外结束的最初原因可能对程序的行为来说会显得更重要。对于那些在try语句块中执行break、continue或return语句,只是为了使其行为被finally语句块所否决掉的程序,要理解其行为是特别困难的。

总之,每一个finally语句块都应该正常结束,除非抛出的是不受检查的异常。千万不要用一个return、break、continue或throw来退出一个finally语句块,并且千万不要允许将一个受检查的异常传播到一个finally语句块之外去。

<template> <div class="login-container"> <div class="login-box"> <!-- 头部Logo与标题 --> <div class="login-header"> <div class="login-logo"> <i class="fas fa-shield-alt"></i> </div> <h2>停车场管理系统</h2> </div> <!-- 登录表单 --> <div class="login-form"> <!-- 用户名输入 --> <div class="form-group"> <label for="username">用户名</label> <div class="input-group"> <i class="fas fa-user"></i> <input type="text" id="username" v-model="form.value.username" placeholder="请输入用户名" :class="{'error': error.value.username}" > </div> <p class="error-message" v-if="error.value.username">{{ error.value.username }}</p> </div> <!-- 密码输入 --> <div class="form-group"> <label for="password">密码</label> <div class="input-group"> <i class="fas fa-lock"></i> <input type="password" id="password" v-model="form.password" placeholder="请输入密码" :class="{'error': error.value.password}" > </div> <p class="error-message" v-if="error.password">{{ error.value.password }}</p> </div> <!-- 登录按钮 --> <button class="btn btn-primary btn-block" @click="handleLogin" :disabled="loading" > <span v-if="loading"> <i class="fas fa-spinner fa-spin"></i> 登录中... </span> <span v-else> 登录 <i class="fas fa-sign-in-alt"></i> </span> </button> <!-- 版本信息 --> <div class="login-footer"> <p>版本号: 1.0.0</p> </div> </div> </div> </div> </template> <script setup> import { ref, reactive,onMounted } from 'vue'; import { login } from '@/services/loginService.js'; // 引入登录服务 import {useRoute, useRouter} from 'vue-router'; // 路由跳转 // 响应式数据 const form = reactive({ value:{ username: '', password: '' } }); //状态管理 const loading = ref(false); const error = reactive({ value:{ username: '', password: '' }, general: '' }); const router = useRouter(); // 初始化路由实例 const route = useRoute(); // 表单验证 const validateForm = () => { let isValid = true; if (!form.username) { error.value.username = '请输入用户名'; isValid = false; } else { error.value.username = ''; } if (!form.password) { error.value.password = '请输入密码'; isValid = false; } else { error.value.password = ''; } return isValid; }; // 登录处理 const handleLogin = async () => { // 重置错误信息 error.value = { value:{username: '', password: ''}, general: '' }; //验证表单 if (!validateForm()) { return; } loading.value = true; try { // 调用登录接口APi(对接 loginService.js) const response = await login(form.username, form.password); //处理后端响应 if (response.code === 200 && response.data) { //存储用户信息 localStorage.setItem('token', response.data.token || ''); localStorage.setItem('userId', response.data.id || ''); localStorage.setItem('userType', response.data.type || ''); localStorage.setItem('username', response.data?.username || ''); localStorage.setItem('isLoggedIn', 'true'); console.log('登录成功'); // 登录成功,跳转到首页 const redirect = route.query.redirect || '/home'; router.push(redirect); } } catch (err) { if (err.code === 1005) { error.value.general = '用户名或密码错误'; } else { error.value.general = err.message || '登录失败,请稍后重试'; } } finally { loading.value = false; } }; // 页面加载时检查登录状态 onMounted(() => { const isLoggedIn = localStorage.getItem('isLoggedIn') === 'true'; if (isLoggedIn) { router.push('/home'); } }); </script> <style scoped> .login-container { display: flex; justify-content: center; align-items: center; min-height: 100vh; background-color: #f5f5f5; background-image: url('https://picsum.photos/id/1048/1920/1080'); background-size: cover; background-position: center; position: relative; } .login-container::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); } .login-box { background-color: white; border-radius: 10px; box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1); width: 400px; max-width: 90%; padding: 40px; position: relative; z-index: 1; } .login-logo { text-align: center; margin-bottom: 30px; } .login-logo i { font-size: 48px; color: #1abc9c; margin-bottom: 10px; } .login-logo h2 { color: #2c3e50; font-size: 24px; } .form-group { margin-bottom: 20px; } .form-group label { display: block; margin-bottom: 8px; color: #2c3e50; font-weight: 500; } .input-group { display: flex; align-items: center; border: 1px solid #ddd; border-radius: 4px; padding: 10px; } .input-group i { width: 25px; color: #999; } .input-group input { flex: 1; border: none; outline: none; padding-left: 10px; font-size: 16px; } .remember-me { display: flex; align-items: center; } .remember-me input { margin-right: 8px; } .btn-block { width: 100%; margin-top: 20px; } .login-footer { text-align: center; margin-top: 20px; color: #999; font-size: 14px; } .error-message { color: #e74c3c; margin-bottom: 15px; text-align: center; } </style>表单登录输入未能识别到数据
最新发布
06-20
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值