第一部分:手撸你的第一个Java程序 1. 配置 Java 运行环境 使用 AdoptOpenJdk 选择 OpenJdk16 HotSpot 版本
2. Java 的基础语法与数据类型 略
3. 编写一个程序 查阅资料: Java 16 Api
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 import java.lang.Integer;import java.util.HashMap;public class FacSum { private static HashMap<Integer, Integer> map = new HashMap <>(); public static void main (String[] args) { if (args.length != 1 ) { System.out.println("The program only takes one and only needs one argument." ); } int target = Integer.parseInt(args[0 ]); int sum = 0 ; map.put(1 , 1 ); map.put(2 , 2 ); map.put(3 , 6 ); map.put(4 , 24 ); for (int i = 1 ; i <= target; i++) { sum += fac(i); } System.out.println(sum); } private static int fac (int num) { if (map.containsKey(num)) return map.get(num); int fac = fac(num-1 ) * num; map.put(num, fac); return fac; } }
关于程序中的错误
类文件与源文件名不匹配且忘记导包 (我想念 idea 了)
非 static 方法与字段无法被 static 方法访问
parse 拼写错误
在数组中,length 为字段并非方法(String 害人不浅)
传入给 Java 的参数数组并不包含它本身
第二部分:简单的计算器 使用 Intellij Idea 使用正则表达式进行字符串匹配与处理
关于正则 之前有略微了解但并未深入,这次借助各种资源帮助完成了正则表达式的编写:regex101 Java 正则表达式 | 菜鸟教程 正则表达式的优化: Using alternation or character class for single character matching? - Stack Overflow
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 package io.github.jzyfc;import java.io.*;import java.util.Scanner;import java.util.regex.Matcher;import java.util.regex.Pattern;public class SimpleCalculator { public static void main (String[] args) throws IOException { int first, second; Matcher m; String calc; String result = "" ; String ret; System.out.println("请输入要计算的式子或选择保存上一次计算结果(输入s)" ); Scanner scanner = new Scanner (System.in); String newLine = scanner.nextLine(); String pattern = "(\\d+) *([+\\-*/]) *(\\d+)" ; Pattern p = Pattern.compile(pattern); ret = readData(); if (!ret.equals("" )) System.out.println("上次的计算结果为:" +ret); while (!newLine.isEmpty()) { if (newLine.equals("s" )){ if (ret.equals("" )) { System.out.println("上次计算结果为空,请输入要计算的式子" ); newLine = scanner.nextLine(); continue ; } saveData(ret); return ; } m = p.matcher(newLine); if (!m.matches()) { System.out.println("错误的输入格式" ); } else { first = Integer.parseInt(m.group(1 )); second = Integer.parseInt(m.group(3 )); calc = m.group(2 ); result = switch (calc) { case "+" -> String.valueOf(first + second); case "-" -> String.valueOf(first - second); case "*" -> String.valueOf(first * second); default -> first / second + "......" + first % second; }; ret = String.format("%d%s%d=%s" , first, calc, second, result); System.out.println("计算结果为: " + ret); } newLine = scanner.nextLine(); } } private static void saveData (String s) throws IOException { FileWriter fileWriter = new FileWriter ("clacSave" , false ); fileWriter.write(s); fileWriter.flush(); fileWriter.close(); } private static String readData () { try { return new BufferedReader (new FileReader ("calcSave" )).readLine(); } catch (IOException e) { return "" ; } } }
第三部分:计算结果存储 使用 FileReader, BufferedReader 与 FileWriter完成了数据的读写操作。 添加了两个方法以完成数据的读写。
遇到的问题
简单粗暴地处理 IOException 导致程序在无 calcSave 文件时读取数据出错, 后采用 try-catch 捕获异常
一开始采用正则解析 s 指令, 导致输入 s 之后程在读取数据时分组出错(不存在1、2、3组)。后采用 if 判断
文件均以 UTF-8 编码存储,导致最后程序乱码, 后添加编译器参数解决 参考资料:CSDN