勇哥注:
这个系列的贴子主要是从Visual Studio+ C#语言的角度对比来学习java。
C#其实一门学习java的语言,两者是竞争关系。大部分人都是java转C#,这个系列贴子则是反过来由C#转java。
测试断点,单步调试
比较有特点的是,在断点的圆点上右键,可以设置条件断点,例如i==10的时候断下。
另外vs的实时窗口可以输入表达式查阅变量的值,在ida中(windows中)使用表达式计算功能可以类似效果(如图2所示)
更多的调试技巧见:https://zhuanlan.zhihu.com/p/697641921
横 1:从其他界面回到当前断点界面光标处。
横 2:从断点处开始,逐行执行代码,如果遇到方法,直接跳过。
横 3:从断点处开始,逐行执行代码,如果遇到方法,会进入方法,但是只能进入自定义方法,不会进入官方类库的方法。
横 4:从断点处开始,逐行执行代码,如果遇到方法,会进入方法,适用于所有方法。
横 5:从当前断点处回退,回到方法的调用处。
横 6:回退断点,回到上一个断点处,与横 5 的区别在于,它会回到上一个方法的断点中,而横 5 只会回到上一个方法的调用处,并不会进入方法。
横 7:回到断点光标处,与横 1 的区别在于,它会继续往后执行一行代码。
横 8:计算表达式,在 debug 模式中,可以直接输入当前类中的任意一个方法,直接进行运算,输出结果,如下图所示。
竖 1:重新运行程序,进入 debug 模式。
竖 2:执行程序,但不是逐行执行,而是跳转到下一个断点处。
竖 3:暂停断点,这个基本用不到。
竖 4:终止程序的运行。
竖 5:显示所有断点,如下图所示。
package com.skcircle.mtvdemo; import com.sun.org.apache.bcel.internal.Const; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.PrimitiveIterator; import java.util.Scanner; public class mtvMain { public static void main(String[] args) throws IOException { String musicName; Scanner sc=new Scanner(System.in); System.out.println("输入歌曲名:"); while(true) { musicName = sc.nextLine(); if (musicName.length() < 1) { System.out.println("歌曲名字要大于等于1个字符"); continue; } break; } List<String> f1=mtvMethod.findMusic(musicName); for (String str:f1 ) { int index1= f1.indexOf(str)+1; System.out.println("["+index1+"]"+str); } System.out.println("搜索结果:"+f1.size()); System.out.println("输入歌曲编号(1-"+f1.size()+"):"); String selMusic = sc.nextLine(); String name=f1.get(Integer.parseInt(selMusic)-1); String m="G:\\KuGou\\"+name; ProcessBuilder pb=new ProcessBuilder("C:\\Program Files (x86)\\SPlayer\\splayer.exe",m); Process p= pb.start(); sc.close(); } } class mtvMethod { private static String MusicPath= "D:\\新技术学习与实验\\java\\mtv2\\mymtv\\src\\com\\skcircle\\mtvdemo\\allMtvList"; static List<String> findMusic(String _musicName) throws IOException { List<String> res=new ArrayList<>(); String txt=new String(Files.readAllBytes(Paths.get(MusicPath)), StandardCharsets.UTF_8); String[] ary1= txt.split("\n"); /* for(int i=0;i< ary1.length;i++) { System.out.println(ary1[i]); }*/ for (String str:ary1 ) { if(str.indexOf(_musicName)>=0) { res.add(str); } //System.out.println(str); } return res; } }
输入歌曲名:
凤凰传奇
[1]凤凰传奇 - 中国味道.mkv
[2]凤凰传奇 - 全是爱.mkv
[3]凤凰传奇 - 吉祥如意 - 相约北京.mkv
[4]凤凰传奇 - 天籁传奇.mkv
[5]凤凰传奇 - 大声唱 - 绿旋风.mkv
[6]凤凰传奇 - 天蓝蓝.mkv
[7]凤凰传奇 - 奢香夫人.mkv
[8]凤凰传奇 - 我不是公主.mkv
[9]凤凰传奇 - 我从草原来.mkv
[10]凤凰传奇 - 我和草原有个约定.mkv
[11]凤凰传奇 - 我们的歌谣.mkv
[12]凤凰传奇 - 新康定情歌.mkv
[13]凤凰传奇 - 最炫民族风.mkv
[14]凤凰传奇 - 溜溜的情歌.mkv
[15]凤凰传奇 - 相约北京 - 北京平四 北京平四 奥运.mkv
[16]凤凰传奇 - 等爱的玫瑰.mkv
[17]凤凰传奇 - 相约北京.mkv
[18]凤凰传奇 - 策马奔腾.mkv
[19]凤凰传奇 - 绿旋风.mkv
[20]凤凰传奇 - 自由飞翔.mkv
[21]凤凰传奇 - 荷塘月色.mkv
[22]凤凰传奇 - 草原凤凰.mkv
[23]凤凰传奇 - 郎的诱惑.mkv
[24]凤凰传奇 - 醉美天下.mkv
[25]凤凰传奇 - 高山槐花开.mkv
[26]凤凰传奇-全是爱_国语_流行_MTV_128033273_[28881.com]_MV分享精灵_MTVP2P.mkv
[27]凤凰传奇-大声唱.mkv
[28]凤凰传奇-大声唱_国语_流行_KTV_FP31232839_[mvmkv.com]_MV分享精灵_MTVP2P.mkv
[29]凤凰传奇-大声唱_国语_流行_KTV_FP40520425_[28881.com]_MV分享精灵_MTVP2P.mkv
[30]凤凰传奇-天籁传奇_国语_流行_NCB03019_[mvmkv.com]_MV分享精灵_MTVP2P.mkv
[31]凤凰传奇-我从草原来_国语_流行_MTV_107033291_[28881.com]_MV分享精灵_MTVP2P.mkv
[32]凤凰传奇-我们的歌谣_国语_流行_MTV_128033292_[mvmkv.com]_MV分享精灵_MTVP2P.mkv
[33]凤凰传奇-最炫民族风_国语_流行_MTV_111033299_[28881.com]_MV分享精灵_MTVP2P.mkv
[34]凤凰传奇-策马奔腾.mkv
[35]凤凰传奇-自由飞翔_国语_流行_MTV_169033317_[28881.com]_MV分享精灵_MTVP2P.mkv
[36]凤凰传奇-荷塘月色_国语_流行_KTV_140033321_[28881.com]_MV分享精灵_MTVP2P.mkv
[37]凤凰传奇-高山槐花开_国语_情歌对唱_NAA02118_[mvmkv.com]_MV分享精灵_MTVP2P.mkv
[38]凤凰传奇^玖月奇迹-美丽华语走起来_国语_情歌对唱_NAF01827_[mvmkv.com]_MV分享精灵_MTVP2P.mkv
[39]筷子兄弟^凤凰传奇-最炫小苹果_国语_情歌对唱_NAF10220_[mvmkv.com]_MV分享精灵_MTVP2P.mkv
[40]凤凰传奇-将进酒_国语_流行_N8300124_[mvmkv.com]_MV分享精灵_MTVP2P.mkv
搜索结果:40
输入歌曲编号(1-40):
36
String[] stringArray = {"apple", "banana", "cherry"};
List<String> stringList = Arrays.stream(stringArray)
.collect(Collectors.toList());
这个没C#的扩展方法.ToList<T>来得方便。
java没有扩展方法。
3. throws声明异常
例如下面的main方法的throws,是由于new Scanner(System.in); 这句被编译器报错,然后通过一个向导自动添加上去的。
public static void main(String[] args) throws IOException { String musicName; Scanner sc=new Scanner(System.in);
throws关键字用于在方法签名中声明该方法可能会抛出的检查型异常(checked exceptions)。
当你使用throws声明一个异常时,你告诉方法的调用者:
“这个方法可能会因为某些原因抛出这个异常,所以你需要处理它。”
处理异常的方式有两种:捕获(使用try-catch块)或继续声明(使用throws)。
C#中没有这种特性,只是在///这样的xml注释中,写清楚此函数有哪些异常,仅做为编写代码时的提示作用。

