cs108 03 ( 调试, java通用性)

By | 06月27日
Advertisement

Debuger

Great questions

These questions will solve most bugs:

what method shows the symptom ? what lines of code produces that symptom ?

what is the state of the receiver object in that code ? what were the param values passed in ?

if it’s an exception, what does the exception error message say – null pointer? array access? Somethimes the exception name can be very informative.

调优方法

Eclipse debugger , 好用

println()

注释掉部分代码

Truths of Debugging

  • 直觉很重要, 你可以测试你直觉的想法, 但当直觉与实际发生碰撞时, 实际发生获胜.
  • 简单的代码也会引起重大的bug, 不要忽视那些简单的代码, 往往是它们出现问题.
  • 注意你自己定义的变量, 程序中出现的bug, 往往是你定义的变量不是你想要的值.
  • 如果你的程序1分钟前还可以正常执行, 但现在不行了, 那么你上次改动过什么? 注意: 如果你每写50行code就测试一下, 那么当程序出问题时, 你就 知道是哪50行出现的问题.
  • 不要随便修改代码来追踪bug, 这样有可能带来新的bug.
  • 如果你发现一些错误跟你一直追踪的错误没有关系, 那么先来将这些错误搞定吧, 没准这些错误与你一直追踪的bug是有关系的, 只是你还没想到.

Java 通用性(Generics)

  • Using a generic class, like using ArrayList<String>
  • Writing generic code with a simple <T> or <?> type parameter
  • Writing generic code with a <T extends Foo> type parameter

Use Generic Class

ArrayList<String> strings = new ArrayList<String>();
strings.add("hi");
strings.add("there");
String s = strings.get(0);

循环使用

List<String> strings = ...
for (String s: strings) {
  System.out.println(s);
}

例子:

public static void dempList() {
  List<String> a = new ArrayList<String>();
  a.add("Don't");
  a.add("blame");
  a.add("me");

  for (String str: a) {
    System.out.println(str);
  }

  Iterator<String> it = a.iterator();
  while (it.hasNext()) {
    String string = it.next();
    System.out.println(String);
  }
  List<Integer> ints = new ArrayList<Integer>();
  for (int i = 0; i<10; i++) {
    ints.add(new Integer(i * i));
  }
  int sum = ints.get(0).intValue() + ints.get(1).intValue();

  sum = ints.get(0) + ints.get(1);

  // Generic Map Example Code
  public static void demoMap() {
    HashMap<Integer, String>map = new HashMap<Integer, String>();
    map.put(new Integer(1), "one");
    map.put(new Integer(2), "two");
    map.put(3, "three");  // 自动包装
    map.put(4, "four");

   String s = nap.get(new Integer(3));
   s = map.get(3)  // 自动包装

  HashMap<String, List<Integer>> counts = new HashMap<String, List<Integer>>();
  List<Integer> evens = new ArrayList<Integer>();
  evens.add(2);
  evens.add(4);
  evens.add(6);
  counts.put("even", evens);

  List<Integer> evens2 = counts.get("evens");

Define a Generic<T> Class/Method

you can define your own class as a generic class. the class definithion code is parameterized by a type, typically called<T>. This is more or less what ArrayList does. At the very start of the class, the parameter is added like this: public calss Foo<T>

这个 T 有以下限制: (T 的本质就好比是一个普通的类型)

- declare variables, parameters, and return types of the type T

- use = on T pointers

- call methods that work on all Objects, like .equals()

记住: where you see “T”, it is just replaced by “Object” to produce the code for runtime. So the ArrayList<String>code and the ArrayList<Integer>code … those two are actually just the ArrayList<Object>code at runtime.

例子:

public class Pair<T> {
  private T a;
  private T b;
  private List<T> unused;

  public Pair(T a, T b) {
    this. a = a;
    this.b = b;
  }
  public T getA() {
    return a;
  }
  public T getB() {
    return b;
  }
  public void swap() {
    T temp = a;
    a = b;
    b = temp;
 }

 public boolean isSame() {
    return a.equals(b);
}

public boolean contains(T elem) {
  return (a.equals(elem) || b.equals(elem));
}
public static void main(String[] args) {

// integer 类型的可以
Pair<Integer> ipair = new Pair<Integer>(1, 2);
  Integer a = ipair.getA();
  int b = ipair.getB();  // 没包装

// String 类型的也可以
  Pair<String> spair = new Pair<String>("hi", "there");
  String s = spair.getA();
}

Generic <T> Method

与整个类都使用通用来说, 可以针对某个方法来使用通用, 语法: public <T> void foo(List<T> list)

例如:

public static <T> void removeAdjacent(Collection<T> coll) {
  Iterator<T> it = coll.iterator();
  T last = null;
  while (it.hasNext()) {
    T curr = it.next();
    if (curr == las) it.remove();
    last = curr;
  }
}

<T> Method – use a <T> type on the method to identify what type of element is in the collection. The <T> goes just before the return type. T can be used to decalre variables, return types, etc. This is ok, but slightly heavyweight, since in this case we actually don’t care what type of thing is in there. This removes elements that are == to an adjacent element.

?/T with “extends” Generics

extends 可以限制 T, 例如 with a <T extends Number> – for any T value , we can assume it is a Number subclass, so .intValue()

例如:

public class PairNumber <T extends Number> {
  private T a;
  private T b;

  public PairNumber( T a, T b) {
    this.a = a;
    this.b = b;
  }
  public int sum() {
    return (a.intValue() + b.intValue());
  }

?/T Extends Method

public static int sumAll(Collection<? extends Number> nums) {
  int sum = 0;
  for (Number num : nums) {
    sum += num.intValue(0;
  }
  return sum;
}

Similar Posts:

  • [原创] 如何用Eclispe调试java -jar xxx.jar 方式执行的jar包

    有时候,我们经常会需要调试 java -jar xxx.jar方式运行的代码,而不是必须在Eclipse中用Debug或者Run的方式运行.比如我们拿到的SourceCode不完整.Java提供了一种调试的机制. 1. 我们可以使用命令: java -agentlib:jdwp=transport=dt_socket,server=y,address=8050,suspend=y -jar xxx.jar 来打开调试.运行后,它会在8050端口监听调试器的Attach的信号. 2. 然后,我们在

  • 使用Eclipse调试Java程序代码(组图)

    创建Java项目 当Eclipse首次启动时进入的是资源透视图,在这个透视图中可以管理项目.文件夹.文件和其它资源,按照Eclipse的说法,这些面板叫做视图,一套完整的视图叫做透视图,在资源透视图中,你可以使用左上方的视图(导航视图)导航和创建资源. 在Eclipse中做事之前,如创建Java程序,需创建一个Java项目,创建Java项目的步骤如下: 1.在导航视图上点击右键,在弹出的上下文菜单中选择新建?项目: 2.在新建项目对话框中,Eclipse提供了项目选项:Java,插件开发等.因此

  • Eclipse远程调试Java

    Java远程调试方式,两种方式进行远程调试 上面的表示是Eclipse配置为Socket Listen方式,下面的是Socket Attach方式 对于远程程序上图表示主动链接调试器,下图表示远程程序正常运行 允许调试器连接jvm Eclipse配置: 菜单(Eclipse):Run-->Debug Configurations打开调试配置面板,如图配置 左侧新建一个远程调试 左侧Project:源代码工程 左侧Connection Type:调试方式 左 侧Connection Propert

  • eclipse中调试Java程序提示Cannot connect to VM socket closed

    操作系统是Win7 还有console中提示 FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_LOAD(196) ERROR: transport library not found: dt_socket ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_LOAD(509) JD

  • Tomcat下调试Java Web工程的一种方法

    找到Tomcat下conf目录下的server.xml文件 默认,它是加载webapp目录下的工程的,把这段代码注释掉 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <

  • Java实用技巧:用JPDA轻松调试Java代码

    星期六 2007年08月04日 Java实用技巧:用JPDA轻松调试Java代码 在无法访问运行中的实例时,调试一个Java程序可能相当麻烦:当应用程序在远程环境下运行,并且不会在控制台或日志文件中输出任何结果时,调试工作变得更加困难.如果你需要对一个运行中的Java应用程序进行全方位调试,Sun的Java平台调试构架(JPDA)可为您提供帮助. JPDA是一组API集合,旨在帮助你调试Java代码.J2SE自1.2.2版开始推出JPDA工具集,并在1.3.x版中将它直接包含在J2SE软件包中.

  • 如何在Eclipse中Debug调试Java jdk源代码

    转载自:http://maider.blog.sohu.com/306155966.html 背景 有的时候你想debug调试Java的源代码,就想试图在Java源代码中设置断点,在Eclipse中常常会出现Unable to insert breakpoint Absent Line Number Information错误.导致这个错误的原因是Eclipse默认使用了JRE环境,而事实上只有JDK环境才包含有Debug信息.接下来我们介绍如何为你的项目设置JDK环境,从而让你可以调试Java

  • myeclipse调试java

    利用junit调试java代码 先打断点,右键debug as junit,打开debug视图 点击F6,执行过变量所在语句,把鼠标移到变量上就可以看到变量的值 本文出自 "matengbing" 博客,请务必保留此出处

  • 使用dbx调试java程序

    调试java程序和c一样,只不过在设置断点的时候要注意. 调试java程序 ./dbx yourJavaProg 假如我的类是 com.test.dbx.DbxTest.java,有一个方法叫做doTask: 那么设置断点的命令应当是: stop in com.test.dbx.DbxTest.doTask 或者 stop inmethod com.test.dbx.DbxTest.doTask 参见: http://developers.sun.com/solaris/articles/Jav

  • 远程调试Java程序

    java 可以以调试模式启动,启动后可以使用 jdb 对程序进行调试.以调试模式启动,需要加入以下参数: java -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n 一般如 tomcat, jboss, weblogic 等服务器中会使用 JAVA_OPTS 环境变量,如果要运行这类服务,可以设置该环境变量如下: linux 下 export JAVA_OPTS="$JAVA_OPTS -Xdebug -X

Tags: