求助:使用if语句的Java正多边形面积计算器变量无法解析报错
代码编译报错与逻辑问题定位
你遇到的所有cannot be resolved to a variable类报错,全部来自以下几个明确的代码问题:
- 变量作用域错误(核心报错原因)
Java中由大括号包裹的代码块,内部声明的变量仅在当前大括号范围内有效。你之前把存边长的length变量声明在边数校验的else块内部,块外的所有分支判断、计算逻辑都访问不到这个变量;同时面积计算结果calculation仅在第一个判断分支里做了声明,后续分支赋值、最终输出语句都因为超出作用域/未声明无法访问,自然触发解析错误。 - 分支判断逻辑错位
项目要求是根据输入的边数匹配对应面积公式,但你写的判断分支全部拿存边长的length变量去和3、4、5、6做比较,相当于把边长当边数选公式,哪怕编译能通过,计算结果也是完全错误的。 - API拼写与语法错误
Java标准输出方法是System.out.println(),你把方法名写成了首字母大写的Println,不符合方法命名规则,会直接触发编译错误;同时你创建了两个独立的Scanner实例,不仅冗余,还容易触发输入流读取异常。 - 输出拼接错误
最终打印语句里你直接把Scanner对象sidelength拼到了输出字符串中,实际应该拼接存边长的数值变量length;而且边数校验不通过时,你仅打印了错误提示,没有终止程序,后续代码仍会执行,触发更多无意义报错。
修正后的可运行版本
import java.util.Scanner; public class RegularShapeArea { public static void main(String[] args) { // 统一使用一个Scanner实例读取所有用户输入 Scanner inputScanner = new Scanner(System.in); System.out.println("How many sides does the shape have (between 3 and 6)? "); // 边数为整数类型,直接接收整数输入 int sides = inputScanner.nextInt(); // 边数范围校验 if ((sides <3) || (sides >6)) { System.out.println("The value entered was not between 3 & 6."); // 校验不通过直接关闭输入流并终止程序,不执行后续计算 inputScanner.close(); return; } // 边长、面积变量声明在所有代码块外层,保证全流程可访问 System.out.println("How long is each side? "); double length = inputScanner.nextDouble(); double calculation; // 根据边数匹配对应面积公式,符合项目要求的if分支规则 if (sides == 3) { calculation = (Math.sqrt(3)/4) * (length *length); } else if (sides == 4) { calculation = (length * length); } else if (sides == 5) { calculation = (Math.sqrt(5 * (5 + 2 * (Math.sqrt(5)))) * length * length) / 4; } else { // 前面已完成边数范围校验,剩余合法值仅为6 calculation = ((3 * Math.sqrt(3) * (length * length)) / 2); } // 修正println的拼写错误,正确拼接实际数值 System.out.println("The surface area of a shape with " + sides + " sides, each of length " + length + " is " + calculation); inputScanner.close(); } }
改动说明
- 把
length、calculation、Scanner实例全部声明在代码块的最外层,彻底解决变量作用域导致的无法解析报错 - 把原来错误的“拿边长判断分支”全部替换为“拿边数
sides匹配公式”,完全匹配项目要求 - 保留了你原来核对过的所有面积计算公式,没有改动逻辑
- 修正了
Println的拼写错误,移除了冗余的Scanner实例 - 边数非法时直接终止程序,避免无意义的后续执行
- 修正了输出语句中错误拼接Scanner对象的问题,直接拼接实际的边长、面积数值
内容的提问来源于stack exchange,提问作者Aaron Copeland
相关产品推荐
相关产品推荐

