今日八股:外键只能连主键?我把这话说反了(9/4)

今日八股:外键只能连主键?我把这话说反了(9/4)

今天的练习

周五,这周最后一个练习日,上午异常、下午前端、晚上数据库,三轮九问。白天答的时候自我感觉挺好,晚上把回答翻出来一整理,两处硬伤,还都是同一类:把话说反了。一个说运行时异常不影响程序执行,一个说唯一索引不能当外键目标。当时都答得挺自信,回头看想拍自己。

Java:异常这棵树

Throwable 下面怎么分?受检异常和运行时异常真正的区别?throw 和 throws 的区别,各写一行代码。

树我画对了:Throwable 下面是 Error 和 Exception,Exception 再分运行时异常和受检异常。受检异常是编译器强制要求处理的,因为调用方要面对外部风险,IO、数据库这类,要么 try-catch,要么在方法上 throws。throw 写在方法体里主动抛一个,一次只能抛一个;throws 写在方法签名上,能声明多个,逗号隔开。

翻车的是中间那句。我说运行时异常是运行中产生的 bug,大多是代码逻辑问题,不会影响程序执行。前面都对,最后半句反了。运行时异常恰恰是运行到那行才炸的,炸了没人接线程直接挂。空指针谁都写过,哪有"不影响执行"这回事。我想说的其实是编译期没人拦你,一着急说成了不影响执行,意思全拧了。

还有个说法不严谨。我说运行时异常是"运行过程中产生的 bug",可 FileNotFoundException 也是运行到才抛的,它偏偏是受检异常。这俩的分界就一条:编译器查不查。RuntimeException 全家是运行时,Exception 剩下那些是受检。

补个代码

// throws:方法签名上声明,可以写多个
public void readFile(String path) throws IOException, SQLException {}

// throw:方法体里主动抛,一次一个
throw new IllegalArgumentException("参数不能为空");

这题当时只答了概念,题目让写代码我给忘了。其实代码比概念好记,写一遍就再也不会混。

前端:全对的一轮,也有个没点破的坑

下午这轮是今天唯一零失误的。computed 的缓存、依赖不变不重算、模板里不用加括号,都答了,还总结了一句"computed 是声明式的计算结果,methods 是命令式的函数调用",自己挺满意。

但 slice 和 splice 那题有个坑我当时没说破,例子算是蒙对的。arr 是 [1,2,3,4] 的时候 splice(1,3) 返回 [2,3,4]、原数组剩 [1],我答对了。可这俩方法的第二个参数根本不是一回事:slice(1,3) 的 3 是结束位置,到 3 为止,还不含 3;splice(1,3) 的 3 是数量,从下标 1 开始删 3 个。数组要是五个元素,splice(1,3) 删的是 2、3、4。拿 slice 的思路去理解 splice 必错。我现在的记法是:slice 第二参是终点站,splice 第二参是步数。

CSS 那题简单,内联、id、类、元素的优先级排对了,!important 最大,能压过内联。补一句,两条声明都带 !important 的时候才回到权重和先后顺序去比,所以它是底牌,业务代码里别乱用。

数据库:晚上栽了个大的

主键和唯一索引的区别,我前面答得挺顺。一张表只能一个主键,非空、唯一;唯一索引能建多个,允许 NULL,多个 NULL 不算重复,因为 SQL 里 NULL 不等于 NULL。还打了个比方,主键是行的身份标识,唯一索引是业务约束,手机号身份证不能重复那种。

坏就坏在我补的那句,我说唯一索引不能被外键引用。错。外键引用目标列的要求是值能唯一定位到一行,主键行,唯一索引也行。平时项目里外键习惯连主键,连多了容易产生"只有主键能当外键目标"的错觉。MySQL 实际更松,被引用的列只要有索引就行。唯一要注意的是唯一索引列允许 NULL,父表真有 NULL 行的话外键匹配不上,NULL 不参与匹配,所以真拿唯一索引当外键用的时候,那列通常都不许 NULL。

四次挥手我过程答对了,就是说得乱。捋成四步:客户端发 FIN,服务器回 ACK,这之后服务器还能继续发数据,发完了再发 FIN,最后客户端回 ACK。比握手多一次,就是因为服务器收到 FIN 时不一定发完,ACK 和 FIN 只能拆成两次。还有个尾巴,客户端回完 ACK 要等 2MSL 才真关,防最后一个 ACK 丢,知道有这回事就行。401 和 403 没毛病,401 是没登录或者 token 过期,403 是登录了但没权限,先认证后授权。

两处错有个共同点,都是把一个限制条件记死了:以为运行时异常很安全,以为只有主键能当外键。以后答这种题,先反着问自己一句,这句话反过来成立吗。

这周五个工作日全勤。前端连续六轮全对,异常树和索引这两块补完,下周 Java 往应用层走,try-with-resources、自定义异常,把这棵树的枝叶长全。

← 返回文章列表